import Levenshtein
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics import jaccard_score


# NOTE:
# 可用, 但不建议用于判分
# similar_text_tf_idf 和 similar_text_v_jaccard 过于严格, 可用于检测两句话是否完全一致
# similar_text_levenshtein 用于检测两句话格式相近更好


def similar_text_tf_idf(text1, text2):
    # 创建TF-IDF向量化器
    vectorizer = TfidfVectorizer()
    # 将文本转化为TF-IDF矩阵
    tfidf_matrix = vectorizer.fit_transform([text1, text2])
    # 计算余弦相似度，结果是矩阵，取[0, 1]的值
    similarity_matrix = cosine_similarity(tfidf_matrix[0:1], tfidf_matrix[1:2])
    # 余弦相似度的值即为相似度
    similar_value = similarity_matrix[0][0]
    return similar_value


def similar_text_v_jaccard(text1, text2):
    # 创建词袋模型向量化器
    vectorizer = CountVectorizer()
    # 将文本转化为词频矩阵
    count_matrix = vectorizer.fit_transform([text1, text2])
    # 将词频矩阵转化为数组
    count_array = count_matrix.toarray()
    # 计算Jaccard相似度
    similar_value = jaccard_score(count_array[0], count_array[1], average='binary')
    return similar_value


def similar_text_levenshtein(text1, text2):
    # 计算编辑距离
    distance = Levenshtein.distance(text1, text2)
    # 转化为相似度
    max_len = max(len(text1), len(text2))
    similarity = 1 - (distance / max_len)
    return similarity


def test():
    # 示例1
    text1 = f"这次通过VR虚拟实验室进行的一系列关于反相器的实验，体验了从原理设计，版图设计，芯片制作，最后到芯片封装测试一系列完整的流程，了解到了集成芯片制作的总体思路和具体技术，收获颇深。"
    text2 = f"完成反相器制造，学习集成电路设计制造、测试和流程。"
    similar_val = similar_text_tf_idf(text1, text2)
    print(f"tf_idf文本相似度: {similar_val}")
    similar_val = similar_text_v_jaccard(text1, text2)
    print(f"jaccard文本相似度: {similar_val}")
    similar_val = similar_text_levenshtein(text1, text2)
    print(f"levenshtein文本相似度: {similar_val}")
    print("----------------------------------------------------------------------------------------------------------")
    # 示例2
    text1 = "这是第一个文本。"
    text2 = "这是第二个文本，它有一些不同。"
    similar_val = similar_text_tf_idf(text1, text2)
    print(f"tf_idf文本相似度: {similar_val}")
    similar_val = similar_text_v_jaccard(text1, text2)
    print(f"jaccard文本相似度: {similar_val}")
    similar_val = similar_text_levenshtein(text1, text2)
    print(f"levenshtein文本相似度: {similar_val}")




if __name__=="__main__":
    test()